From 02b293b59cb0919a6e2f83b60f40a14177e70212 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 19 Jun 2020 09:58:31 -0400 Subject: [PATCH] listbase: Don't use adjustments for autoscrolling Don't consult the adjustments when determining scroll deltas. It isn't necessary. --- gtk/gtklistbase.c | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/gtk/gtklistbase.c b/gtk/gtklistbase.c index 5e2eb3fb39..9b33c56a53 100644 --- a/gtk/gtklistbase.c +++ b/gtk/gtklistbase.c @@ -1251,23 +1251,36 @@ autoscroll_cb (GtkWidget *widget, GtkListBase *self = data; GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self); double value; + double delta_x, delta_y; value = gtk_adjustment_get_value (priv->adjustment[GTK_ORIENTATION_HORIZONTAL]); gtk_adjustment_set_value (priv->adjustment[GTK_ORIENTATION_HORIZONTAL], value + priv->autoscroll_delta_x); + delta_x = gtk_adjustment_get_value (priv->adjustment[GTK_ORIENTATION_HORIZONTAL]) - value; + value = gtk_adjustment_get_value (priv->adjustment[GTK_ORIENTATION_VERTICAL]); gtk_adjustment_set_value (priv->adjustment[GTK_ORIENTATION_VERTICAL], value + priv->autoscroll_delta_y); + delta_y = gtk_adjustment_get_value (priv->adjustment[GTK_ORIENTATION_VERTICAL]) - value; + if (priv->rubberband) { - priv->rubberband->x2 += priv->autoscroll_delta_x; - priv->rubberband->y2 += priv->autoscroll_delta_y; + priv->rubberband->x2 += delta_x; + priv->rubberband->y2 += delta_y; gtk_list_base_update_rubberband_selection (self); } gtk_widget_queue_draw (GTK_WIDGET (self)); - return G_SOURCE_CONTINUE; + if (delta_x != 0 || delta_y != 0) + { + return G_SOURCE_CONTINUE; + } + else + { + priv->autoscroll_id = 0; + return G_SOURCE_REMOVE; + } } static void @@ -1303,29 +1316,27 @@ update_autoscroll (GtkListBase *self, double x, double y) { - GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self); - double value, page_size, upper; + double width, height; double delta_x, delta_y; - value = gtk_adjustment_get_value (priv->adjustment[GTK_ORIENTATION_HORIZONTAL]); - page_size = gtk_adjustment_get_page_size (priv->adjustment[GTK_ORIENTATION_HORIZONTAL]); - upper = gtk_adjustment_get_upper (priv->adjustment[GTK_ORIENTATION_HORIZONTAL]); + width = gtk_widget_get_width (GTK_WIDGET (self)); - if (x < SCROLL_EDGE_SIZE && value > 0) + if (x < SCROLL_EDGE_SIZE) delta_x = - (SCROLL_EDGE_SIZE - x)/3.0; - else if (page_size - x < SCROLL_EDGE_SIZE && value + page_size < upper) - delta_x = (SCROLL_EDGE_SIZE - (page_size - x))/3.0; + else if (width - x < SCROLL_EDGE_SIZE) + delta_x = (SCROLL_EDGE_SIZE - (width - x))/3.0; else delta_x = 0; - value = gtk_adjustment_get_value (priv->adjustment[GTK_ORIENTATION_VERTICAL]); - page_size = gtk_adjustment_get_page_size (priv->adjustment[GTK_ORIENTATION_VERTICAL]); - upper = gtk_adjustment_get_upper (priv->adjustment[GTK_ORIENTATION_VERTICAL]); + if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL) + delta_x = - delta_x; + + height = gtk_widget_get_height (GTK_WIDGET (self)); - if (y < SCROLL_EDGE_SIZE && value > 0) + if (y < SCROLL_EDGE_SIZE) delta_y = - (SCROLL_EDGE_SIZE - y)/3.0; - else if (page_size - y < SCROLL_EDGE_SIZE && value + page_size < upper) - delta_y = (SCROLL_EDGE_SIZE - (page_size - y))/3.0; + else if (height - y < SCROLL_EDGE_SIZE) + delta_y = (SCROLL_EDGE_SIZE - (height - y))/3.0; else delta_y = 0; -- 2.30.2